#include "api_include.h"

washer_t g_wash = {0};

uint16_t debug_code = 0;

void (*wash_task)(void);

void api_wash_task(void)
{
    static uint8_t init_flag = 0;
	
	/* 门 霍尔检测 */
	g_wash.err.err.door_open = !g_hard.hall;
	/* 供电电压低检测 */
	g_wash.err.err.low_voltage = g_hard.mvol_power<=2500?1:0;
	
    if (init_flag == 0)
    {
		g_wash.soak_time = 0;
		g_wash.wash_time = 10;
		g_wash.rinse_cnt = 2;
		g_wash.spin_intensity = 2;
		g_wash.heat_enable = 0;
		g_wash.tar_water_temp = 30;
        wash_task = plan_mode_task;
        init_flag = 1;
    }
    else
    {
		beep_mode_task();
        switch (g_wash.run_mode)
        {
        case 0: /* 停止 */	
			stop_mode_task();
            break;
        case 1: /* 启动 */
			if(g_wash.err.all != 0)	g_wash.run_mode = 4;
            wash_task();
            fill_mode_task();
            drain_mode_task();
			heat_ctrl_task();
            break;
        case 2: /* 暂停 */
            suspend_mode_task();
            break;
        case 3: /* 设置 */
			if (g_wash.drain_open == 1) 	/* 排水泵控制 */
			{
				g_motor_drain.running = 1;  /* 开启排水泵 */
				g_motor_drain.duty = 500;
			}
			else
			{
				g_motor_drain.running = 0;  /* 关闭排水泵 */
				g_motor_drain.duty = 0;
			}
            /* code */
            break;
        case 4: /* 报警 */
            err_mode_task();
            break;
        default:
            break;
        }
    }
}

/**
 * @description: 蜂鸣器控制任务
 * @return {*}
 */
void beep_mode_task(void)
{
	static uint32_t beep_timer = 0;
	static uint8_t bk_run_mode = 0;

	if(bk_run_mode != g_wash.run_mode)
	{
		bk_run_mode = g_wash.run_mode;
		beep_timer = 0;
	}
	if(beep_timer < BEEP_TIME)
	{
		beep_timer++;
		g_hard.beep = 1;
	}
	else if(beep_timer < 2*BEEP_TIME)
	{
		beep_timer++;
		g_hard.beep = 0;
	}
	else if(beep_timer < 3*BEEP_TIME)
	{
		beep_timer++;
		g_hard.beep = 1;
	}
	else
	{
		g_hard.beep = 0;
	}
}

/**
 * @description: 预约模式处理任务
 * @return {*}
 */
void plan_mode_task(void)
{
    static uint8_t init_flag = 0;

	if(g_wash.run_mode == 0)
	{
		init_flag = 0;
		return;
	}
	
    if(init_flag == 0)
    {
        init_flag = 1;
        if (g_wash.plan_time == 0)  /* 没有设置预约 */
        {
            init_flag = 0;
            wash_task = soak_mode_task;     /* 切换至浸泡模式 */
        }
    }
    else
    {
        g_wash.work_mode = 1;       /* 预约模式 */
        if(g_wash.plan_time > 0X00)       /* 预约时间判断 */
        {
//            g_wash.plan_time--;     /* 倒计时 */
        }
        else        /* 预约时间到达 */
        {
            init_flag = 0;
            wash_task = soak_mode_task;     /* 切换至浸泡模式 */
        }
    }
}

/**
 * @description: 浸泡模式处理任务
 * @return {*}
 */
void soak_mode_task(void)
{
    static uint8_t init_flag = 0;

	if(g_wash.run_mode == 0)
	{
		init_flag = 0;
		return;
	}

	debug_code = init_flag;
	
    if(init_flag == 0)
    {
		if(g_wash.soak_time==0 && g_wash.wash_time==0)
		{
			init_flag = 0;
			wash_task = rinse_mode_task;    /* 切换至洗涤模式 */
		}
		else
		{
			init_flag = 1;
			g_wash.fill_enable = 1;     /* 注水使能 */
		}
    }
    else if(init_flag == 1)
    {
        if(g_wash.fill_enable == 0) /* 注水完成 */
        {
            if (g_wash.soak_time==0)  /* 浸泡未使能 没有设置浸泡时间 */
            {
                init_flag = 0;
                wash_task = wash_mode_task;     /* 切换至洗涤模式 */
            }
            else
            {
                g_wash.soft_timer.interval = g_wash.soak_time;  /* 装填浸泡时间到定时器 */
                g_wash.soft_timer.running = 1;                  /* 启动软件定时器 */
                init_flag = 2;
            }
        }
    }
    else
    {
        g_wash.work_mode = 2;       /* 浸泡模式 */
        if (g_wash.soft_timer.overflow != 1)     /* 浸泡阶段 */
        {
            /* 浸泡模式 */
        }
        else    /* 浸泡完成 */
        {
			g_wash.soft_timer.overflow = 0;
            init_flag = 0;
            wash_task = wash_mode_task;     /* 切换至洗涤模式 */
        }
    }
}

/**
 * @description: 洗涤模式处理任务
 * @return {*}
 */
void wash_mode_task(void)
{
    static uint8_t init_flag = 0;

	if(g_wash.run_mode == 0)
	{
		init_flag = 0;
		return;
	}
    
    if(init_flag == 0)
    {
        if (g_wash.wash_time==0)  /* 没有设置洗涤时间 */
        {
            init_flag = 0;
            wash_task = rinse_mode_task;    /* 切换至漂洗模式 */
        }
        else    /* 洗涤模式使能 */
        {
            init_flag = 1;
            g_wash.soft_timer.interval = g_wash.wash_time;  /* 装填洗涤时间到定时器 */
            g_wash.soft_timer.running = 1;                  /* 启动软件定时器 */
            g_wash.last_pluse = g_encoder.pulse_cnt;        /* 更新一次脉冲计数数据 */
        }
    }
    else if(init_flag == 1)
    {
        g_wash.work_mode = 3;       /* 洗涤模式 */
        if (g_wash.soft_timer.overflow != 1)     /* 洗涤阶段 */
        {
            /* 洗涤阶段 */
            g_drum_speed.target_speed = MOTOR_WASH_SPEED;  /* 设置目标速度 启动滚筒电机 */
            /* 记录转速 到达指定圈数（有误差） 切换一次方向 */
            if(g_wash.last_pluse-g_encoder.pulse_cnt>=COM_CNT ||  g_encoder.pulse_cnt-g_wash.last_pluse>=COM_CNT)
            {
                g_wash.last_pluse = g_encoder.pulse_cnt;            /* 更新一次脉冲计数数据 */
                g_motor_drum.direction = !g_motor_drum.direction;   /* 换相 */
            }
        }
        else    /* 洗涤完成 */
        {
			g_wash.soft_timer.overflow = 0;
            g_drum_speed.target_speed = 0;  /* 停止电机 */
		    g_motor_drum.direction = 0;
            g_wash.drain_time = DRAIN_WATER_HOLD_TIME;  /* 设置排水时间 */
            g_wash.drain_enable = 1;        /* 排水模式 */
            init_flag = 2;
        }
    }
    else if(init_flag == 2)
    {
        if(g_wash.drain_enable == 0)    /* 排水完成 */
        {
            wash_task = rinse_mode_task;    /* 切换至漂洗模式 */
            init_flag = 0;
        }
    }
}

/**
 * @description: 漂洗模式处理任务
 * @return {*}
 */
void rinse_mode_task(void)
{
    static uint8_t init_flag = 0;

	if(g_wash.run_mode == 0)
	{
		init_flag = 0;
		return;
	}
    
    if(init_flag == 0)
    {
        g_wash.finsih_rinse_cnt = 0;
        if (g_wash.rinse_cnt == 0)  /* 没有设置漂洗次数 */
        {
            init_flag = 0;
            wash_task = spin_mode_task;    /* 切换至脱水模式 */
        }
        else
        {
            init_flag = 1;
            g_wash.fill_enable = 1;     /* 注水使能 */
        }
    }
    else if (init_flag == 1)
    {
        if (g_wash.fill_enable == 0)    /* 注水完成 */
        {
            init_flag = 2;
            g_wash.soft_timer.interval = RINSE_ONCE_TIME;   /* 装填漂洗时间到定时器 */
            g_wash.soft_timer.running = 1;                  /* 启动软件定时器 */
            g_wash.last_pluse = g_encoder.pulse_cnt;        /* 更新一次脉冲计数数据 */
        }
    }
    else if (init_flag == 2)
    {
        g_wash.work_mode = 4;       /* 漂洗模式 */
        if (g_wash.soft_timer.overflow != 1)     /* 漂洗阶段 */
        {
            /* 洗涤阶段 */
            g_drum_speed.target_speed = MOTOR_RINSE_SPEED;  /* 设置目标速度 启动滚筒电机 */
            /* 记录转速 到达指定圈数（有误差） 切换一次方向 */
            if(g_wash.last_pluse-g_encoder.pulse_cnt>=COM_CNT ||  g_encoder.pulse_cnt-g_wash.last_pluse>=COM_CNT)
            {
                g_wash.last_pluse = g_encoder.pulse_cnt;            /* 更新一次脉冲计数数据 */
                g_motor_drum.direction = !g_motor_drum.direction;   /* 换相 */
            }
        }
        else    /* 漂洗完成 */
        {
			g_wash.soft_timer.overflow = 0;
            g_drum_speed.target_speed = 0;  /* 停止电机 */
		    g_motor_drum.direction = 0;
            g_wash.drain_time = DRAIN_WATER_HOLD_TIME;  /* 设置排水时间 */
            g_wash.drain_enable = 1;        /* 排水模式 */
            init_flag = 3;
        }
    }
    else if(init_flag == 3)
    {
        if(g_wash.drain_enable == 0)    /* 排水完成 */
        {
			g_wash.finsih_rinse_cnt++;
            if(g_wash.finsih_rinse_cnt < g_wash.rinse_cnt)  /* 漂洗次数不足 */
            {
                init_flag = 1;
                g_wash.fill_enable = 1;     /* 注水使能 */
            }
            else    /* 漂洗完成 */
            {
                init_flag = 0;
				g_wash.finsih_rinse_cnt = 0;
                wash_task = spin_mode_task;    /* 切换至脱水模式 */
            }
        }
    }
}


/**
 * @description: 脱水模式处理任务
 * @return {*}
 */
void spin_mode_task(void)
{
    static uint8_t init_flag = 0;

	if(g_wash.run_mode == 0)
	{
		init_flag = 0;
		return;
	}

    if(init_flag == 0)
    {
        if(g_wash.spin_intensity==0)   	/* 脱水未使能 */
        {
            init_flag = 0;
			g_wash.work_mode = 8;		/* 洗衣完成 */
			g_wash.soft_timer.overflow = 0;
			g_drum_speed.target_speed = 0;
            g_wash.drain_enable = 0;    /* 关闭排水 */
            g_wash.drain_open = 0;
            g_wash.run_mode = 2;    /* 暂停 */
        }
        else
        {
            init_flag = 1;
            g_wash.drain_open = 1;	/* 开启排水 */
            g_wash.soft_timer.interval = SPIN_ONCE_TIME;        /* 装填脱水时间到定时器 */
            g_wash.soft_timer.running = 1;                      /* 启动软件定时器 */
        }
    }
    else
    {
        g_wash.work_mode = 5;       /* 脱水模式 */
        if(g_wash.soft_timer.overflow != 1)
        {
            switch (g_wash.spin_intensity)
            {
                case 1: /* 300rpm */
                    g_drum_speed.target_speed = 300;
                    break;
                case 2: /* 600rpm */
                    g_drum_speed.target_speed = 600;
                    break;
                case 3: /* 900rpm */
                    g_drum_speed.target_speed = 900;
                    break;
                case 4: /* 1200rpm */
                    g_drum_speed.target_speed = 1200;
                    break;
                default:
                    break;
            }
        }
        else    /* 脱水完成 */
        {
            init_flag = 0;
			g_wash.work_mode = 8;		/* 洗衣完成 */
			g_wash.soft_timer.overflow = 0;
			g_drum_speed.target_speed = 0;
            g_wash.drain_enable = 0;    /* 关闭排水 */
            g_wash.drain_open = 0;
            g_wash.run_mode = 2;    /* 暂停 */
        }
    }

}


/**
 * @description: 注水任务
 * @return {*}
 */
void fill_mode_task(void)
{
    static uint8_t init_flag = 0;

	if(g_wash.run_mode == 0)
	{
		init_flag = 0;
		return;
	}
    
    if(init_flag == 0)
    {
        if(g_wash.fill_enable == 1)
        {
            init_flag = 1;
            g_wash.soft_timer.interval = FILL_WATER_TIME_OUT;   /* 装填注水时间到定时器 */
            g_wash.soft_timer.running = 1;                      /* 启动软件定时器 */
        }
		else
		{
            g_hard.inlet = 0;       /* 关闭电磁阀 */
		}
    }
    else
    {
        if(g_wash.fill_enable == 1)
        {
            g_wash.work_mode = 6;   /* 注水模式 */
            if(g_wash.soft_timer.overflow != 1) /* 注水未超时 */
            {
                if(g_hard.water_senor >= (g_wash.fill_level+1)*500)  /* 到达水位 */
                {
                    g_hard.inlet = 0;       /* 关闭电磁阀 */
                }
                else
                {
                    g_hard.inlet = 1;       /* 开启电磁阀 */
                }
            }
            else    /* 注水超时 */
            {
				if(g_hard.water_senor < (g_wash.fill_level+1)*500)  /* 未到达水位 */
                {
                    g_wash.err.err.fill_timeout = 1;
                }
				g_wash.soft_timer.overflow = 0;
				init_flag = 0;
                g_hard.inlet = 0;       /* 关闭电磁阀 */
                g_wash.fill_enable = 0;                                                                                                                                                                                                                                                                                                                              
            }
        }
        else
        {
            init_flag = 0;
        }
    }
}

/**
 * @description: 排水任务
 * @return {*}
 */
void drain_mode_task(void)
{
    static uint8_t init_flag = 0;

	if(g_wash.run_mode == 0)
	{
		init_flag = 0;
		return;
	}
    
	if (g_wash.drain_open == 1) /* 常开控制 */
	{
		g_motor_drain.running = 1;  /* 开启排水泵 */
		g_motor_drain.duty = 500;
	}
	else
	{
		g_motor_drain.running = 0;  /* 关闭排水泵 */
		g_motor_drain.duty = 0;
	}
	
    if(init_flag == 0)
    {
        if(g_wash.drain_enable == 1)
        {
            init_flag = 1;
			g_wash.soft_timer.interval = g_wash.drain_time;     /* 装填排水时间到定时器 */
			g_wash.soft_timer.running = 1;                      /* 启动软件定时器 */
        }
    }
    else
    {
        if(g_wash.drain_enable == 1)
        {
            g_wash.work_mode = 7;   /* 排水模式 */
            if(g_wash.soft_timer.overflow != 1)		/* 排水未超时 */
            {
                g_motor_drain.running = 1;  /* 开启排水泵 */
                g_motor_drain.duty = MOTOR_DRAIN_SPEED;
            }
            else    /* 排水超时 */
            {	
				g_wash.soft_timer.overflow = 0;
				g_wash.drain_enable = 0;
				g_motor_drain.running = 0;              /* 关闭排水泵 */
				g_motor_drain.duty = 0;
            }
        }
        else
        {
            init_flag = 0;
            g_motor_drain.running = 0;              /* 关闭排水泵 */
		    g_motor_drain.duty = 0;
        }
    }
}

/**
 * @description: 水温控制任务
 * @return {*}
 */
void heat_ctrl_task(void)
{
    if(g_wash.run_mode == 1)    /* 运行模式 */
    {
        if(g_wash.heat_enable == 1) /* 开启了温度控制 */
        {
            if(g_wash.work_mode==3 || g_wash.work_mode==4 || g_wash.work_mode==5)   /* 浸泡 洗涤 漂洗 加热 */
            {
                if(g_hard.temp > g_wash.tar_water_temp*100) /* 到达指定温度 */
                {
                    g_hard.heat = 0;
                }
                else
                {
                    g_hard.heat = 1;
                }
            }
            else
            {
                g_hard.heat = 0;
            }
        }
    }
    else
    {
        g_hard.heat = 0;
    }
}

/**
 * @description: 洗衣故障处理任务
 * @return {*}
 */
void err_mode_task(void)
{
	if(g_wash.err.all == 0)	g_wash.run_mode = 2;
	g_hard.heat = 0;		/* 关闭加热 */
	g_hard.inlet = 0;		/* 关闭注水阀 */
    g_motor_drain.running  = 0;		/* 关闭排水泵 */
	g_drum_speed.target_speed = 0;	/* 关闭滚筒电机 */ 
}

/**
 * @description: 洗衣暂停任务
 * @return {*}
 */
void suspend_mode_task(void)
{
	g_hard.heat = 0;				/* 关闭加热 */
	g_hard.inlet = 0;				/* 关闭注水阀 */
    g_motor_drain.running  = 0;		/* 关闭排水泵 */
	g_drum_speed.target_speed = 0;	/* 关闭滚筒电机 */
}


/**
 * @description: 洗衣停止任务
 * @return {*}
 */
void stop_mode_task(void)
{
	g_wash.soft_timer.running = 0;
	plan_mode_task();
	soak_mode_task();
	wash_mode_task();
	rinse_mode_task();
	spin_mode_task();
	fill_mode_task();
	drain_mode_task();
	g_wash.err.all = 0;				/* 清故障 */
	g_hard.heat = 0;				/* 关闭加热 */
	g_hard.inlet = 0;				/* 关闭注水阀 */
	g_drum_speed.target_speed = 0;	/* 关闭滚筒电机 */
	g_wash.drain_open = 0;
	g_motor_drain.running = 0;  /* 关闭排水泵 */
	g_motor_drain.duty = 0;
	wash_task = plan_mode_task;
	g_wash.cur_run_time = 0;
	if(g_wash.soak_time==0 && g_wash.wash_time==0)
	{
		g_wash.sum_run_time = (g_wash.rinse_cnt)*(FILL_WATER_TIME_OUT+RINSE_ONCE_TIME+DRAIN_WATER_HOLD_TIME) + SPIN_ONCE_TIME;
	}
	else
	{
		g_wash.sum_run_time = g_wash.soak_time + g_wash.wash_time + SPIN_ONCE_TIME + FILL_WATER_TIME_OUT + DRAIN_WATER_HOLD_TIME\
							+ (g_wash.rinse_cnt)*(FILL_WATER_TIME_OUT+RINSE_ONCE_TIME+DRAIN_WATER_HOLD_TIME);
	}
}

/**
 * @description: 洗衣程序软件定时器
 * @return {*}
 */
void wash_sw_timer_isr(void)
{
	static uint16_t run_ticker = 0;
	uint32_t mult;
	static uint16_t auto_off_timer = 0;
	
	if(g_wash.ref_time)
	{
		mult = 1;
	}
	else
	{
		mult = 60;
	}
	
	if(g_wash.run_mode == 0)
	{
		run_ticker = 0;
		/* 关闭定时器 */
		g_wash.soft_timer.count = 0;
		g_wash.soft_timer.running = 0;
	}
	
	if(g_wash.run_mode==2 && g_wash.work_mode==8 && g_wash.auto_off==1)
	{
		auto_off_timer++;
		if(auto_off_timer > 5000)
		{
			g_hard.power_on = 0;
		}
	}
	else
	{
		auto_off_timer = 0;
	}
	
	if(g_wash.run_mode != 1)	return;
	
	if(g_wash.run_mode == 1)	/* 运行状态 */
	{
		run_ticker++;
		if(run_ticker >= 1000*mult)
		{
			if(g_wash.plan_time > 0)	/* 存在预约事件 */
			{
				g_wash.plan_time--;
			}
			else
			{
				g_wash.cur_run_time++;		/* 真实运行时间 */
			}
			run_ticker = 0;
		}
	}
    
    if (g_wash.soft_timer.running) {
        if (g_wash.soft_timer.direction == 0) {
            if (g_wash.soft_timer.count < g_wash.soft_timer.interval*1000*mult) {
                g_wash.soft_timer.count++;
                g_wash.soft_timer.overflow = 0;
            } else {
                g_wash.soft_timer.count = 0;
                g_wash.soft_timer.overflow = 1;
                g_wash.soft_timer.running = 0; // 定时器溢出后自动停止
            }
        } else {
            if (g_wash.soft_timer.count > 0) {
                g_wash.soft_timer.count--;
                g_wash.soft_timer.overflow = 0;
            } else {
                g_wash.soft_timer.count = g_wash.soft_timer.interval*1000*mult;
                g_wash.soft_timer.overflow = 1;
                g_wash.soft_timer.running = 0; // 定时器溢出后自动停止
            }
        }
    }
	else
	{
		g_wash.soft_timer.count = 0;
	}
}
